
from app import db
from app.models.atributo import Atributo
from app.models.proyecto import Proyecto
from app.models.fase import Fase


#relacion con la tabla atributos
association_table = db.Table('tipo_item_atributo', db.Model.metadata,
    db.Column('tipo_item_id', db.Integer, db.ForeignKey('tipo_item.id')),
    db.Column('atributo_id', db.Integer, db.ForeignKey('atributo.id'))
)

class TipoItem(db.Model):
    """
    Clase que representa la tabla TipoItem de la base de datos
    """

    __tablename__ = 'tipo_item'
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(50))
    atributo = db.relationship(Atributo,
                    secondary=association_table,
                    backref="atributo")
    
    proyecto_id = db.Column(None, db.ForeignKey("proyecto.id"), nullable=True)
    proyecto = db.relation(Proyecto, backref=db.backref('proyecto'))
    
    fase_id = db.Column(None, db.ForeignKey("fase.id"), nullable=True)
    fase = db.relation(Fase, backref=db.backref('fase'))
    
    __table_args__ = (db.UniqueConstraint('nombre', 'proyecto_id', name='tipoitemProyecto'),)
    __table_args__ = (db.UniqueConstraint('nombre', 'fase_id', name='tipoitemFase'),)
    
    
           
    """
    Constructor de la clase Atributo
    """
    def __init__(self, nombre=None, atributos=None, proyecto =None, fase =None ):
        """
        :param nombre:
        Nombre del atributo
        
        :param  atributos:
        Lista de  atributos que tiene el tipo item
        
        :param  proyecto:
        proyecto al que pertenece el tipo de item
        
        :param  fase:
        fase al que se asigna el tipo de item
        """
        self.nombre = nombre
        self.atributo = atributos
        self.proyecto = proyecto
        self.fase = fase
        
        
    
    def __repr__(self):
        return '<TipoItem %r>' % (self.nombre)
    
    
    def setNombre(self, nombre):
        """
        Setea el nombre del tipo de item
        :param nombre:
        nombre del tipo de item
        """
        self.nombre = nombre
    
    
    def setAtributo(self, atributo):
        """
        Setea la lista de atributos del tipo Item
        :param atributo:
        lista de atributo del tipo Item
        """      
        self.atributo = atributo
    